2.4 运用面向对象范式
几乎所有的GUI程序中,都天生的适合运用面向对象思维开发。在GUI程序中使用面向过程的范式,则存在一些缺陷,这也是为什么C语言不适合开发大型GUI程序的原因
- 需要定义大量全局变量
- 需要在调用代码之前定义相关的函数
- 最严重的是代码不可重用
OOP(Object Oriented Programming 面向对象程序设计)实际上是一种代码组织方式,它将焦点转移到我们想要操作的对象上,而不是操纵它们所需的逻辑。这与面向过程编程形成对比,面向过程编程将程序视为一个逻辑过程,它接受输入,处理并产生一些输出。
OOP提供了一些好处,例如数据抽象,封装,继承和多态。此外,OOP为程序提供了清晰的模块化结构。代码修改和维护很容易,因为可以在不修改现有对象的情况下创建新对象。
聚合式
通常在Python中写Tkinter界面程序时,很多人会使用这种聚合式的写法,实际上这并不是真正纯粹的面向对象的GUI写法,但tkinter本身也仅仅是对过程式的tcl
库的封装,继承小控件并不能真正去重写控件的表现行为,因此是否继承也显得无关紧要,但是在类似Qt这种库中则不然。
下面提供一个编码示例
import tkinter as tk
class App:
def __init__(self, root):
self.root = root
self.set_window()
self.create_top()
self.create_body()
self.create_bottom()
# 设置窗口
def set_window(self):
self.root.title("测试")
self.root.resizable(False, False)
# 创建顶部
def create_top(self):
tk.Label(self.root, text="Top").pack()
# 创建主体
def create_body(self):
self.input = tk.StringVar()
tk.Entry(self.root, textvariable=self.input).pack()
# 创建底部
def create_bottom(self):
tk.Button(self.root, text="Bottom", command=self.onclick).pack()
# 按钮回调函数
def onclick(self):
print(self.input.get())
if __name__ == "__main__":
root = tk.Tk()
App(root)
root.mainloop()
继承式
上面已经说过了,通过继承不能改变控件的表现行为,但是继承式的写法,仍然会让代码更简洁,逻辑更清晰,在其他的面向对象的GUI库中,这是一种常用的写法。
下面是示例
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.set_window()
self.create_top()
self.create_body()
self.create_bottom()
# 设置窗口
def set_window(self):
self.title("测试")
self.resizable(False, False)
# 创建顶部
def create_top(self):
tk.Label(self, text="Top").pack()
# 创建主体
def create_body(self):
self.input = tk.StringVar()
tk.Entry(self, textvariable=self.input).pack()
# 创建底部
def create_bottom(self):
tk.Button(self, text="Bottom", command=self.onclick).pack()
# 按钮回调函数
def onclick(self):
print(self.input.get())
if __name__ == "__main__":
app = App()
app.mainloop()